﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ZackFlame.IronBrainFuck.JIT;

namespace ZackFlame.IronBrainFuck
{
    /// <summary>
    /// Машина BrainFuck, осуществляющая JIT компиляцию программы.
    /// </summary>
    public sealed class BrainFuckJIT : BrainFuckMachine
    {
        BrainCompiler compiler = new BrainCompiler();

        /// <summary>
        /// Исполняет BrainFuck программу на данной машине, предварительно
        /// прекомпилируя её в промежуточный IL код.
        /// </summary>
        /// <param name="brainFuckProgram">Код программы для компиляции и исполнения.</param>
        public override void Execute(string brainFuckProgram)
        {
            BrainMethod method = compiler.Compile(brainFuckProgram);
            CellIndex = method.Execute(Cells, CellIndex, Input, Output);
        }

        /// <summary>
        /// Исполняет предварительно прекомпилированную BrainFuck программу.
        /// </summary>
        /// <param name="compiledProgram">Прекомпилированная BrainFuck программа.</param>
        public void Execute(BrainMethod compiledProgram)
        {
            CellIndex = compiledProgram.Execute(Cells, CellIndex, Input, Output);
        }
    }
}
